#include"stm32f10x.h"
#include "uCOS_Include.h"
#include"GPS.h"
#include"GPRS.h"
#include"uart.h"
#include <stdio.h>

#define USART3_Send					//如果是新板子，则开启USART3_Send通信，关闭 SPI
//#define SPI_Send					//如果是旧板子，则开启SPI通信，关闭USART3_Send

/*GPS数据接收变量*/
u8 num=0;	  				//GPS数据个数
u8 start=0;	  				//开始接受GPS数据标志位
u8 Comma;	  				//接收逗号个数
u8 d,j;		  				//d参数存放GPSRMS中的M，j保证数据缓冲区的长度

u8 Rev_start=0;
u8 Rev_Data[120];
u8 Rev_Data_Buff[120];
u8 Rev_Num=0;

extern OS_EVENT *Sem;
extern OS_FLAG_GRP *Flag_Grp;
extern u8 Statue;		 	//定位状态
extern u8 GPRS_REV_OK;	
extern u8 Modify_Compelet_Flag;

extern struct 	 			//GPS数据缓存区
	{
	u8 Buf[6];	   			//GPS语句标识符缓存空间
	u8 Buf_Time[7];	   		//GPS时间缓存空间
	u8 Buf_WeiDu[10];   	//GPS纬度缓存空间
	u8 Buf_JingDu[11];		//GPS经度缓存空间
	u8 Buf_Statu;	   		//GPS卫星状态缓存空间
	u8 Buf_Speed[6];		//GPS速度缓存空间
	u8 Buf_Course[6];	   //GPS航向角缓存空间
	u8 Buf_Data[7];	   		//GPS日期缓存空间
					   	
	}GPS;



void Delay1ms(u16 time)
{
	u16 i;
	while(time--)
	{
		i=12000;
		while(i--);
	}
}

/************************************
函数功能：向串口1发送一个字符
函数入口：字符参数
函数出口：无
函数说明：
***********************************/
void UART1_SendByte(u16 Data)
{ 
   while (!(USART1->SR & USART_FLAG_TXE));		//发送数据标志位空
   USART1->DR = (Data & (uint16_t)0x01FF);	
   while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);  	/* Loop until the end of transmit */ 
 //  USART_ClearFlag(USART1,USART_FLAG_TXE); 
   
}
/************************************
函数功能：向串口1发送一串字符
函数入口：字符串指针
函数出口：无
函数说明：
***********************************/
void UART1Write(u8* data)
{
	u8 ch;
	while(*data!='\0')
	{
		ch=*data;
		UART1_SendByte(ch);
		*data++;
	}		
}

/************************************
函数功能：向串口1发送一串字符
函数入口：字符串指针
函数出口：无
函数说明：
***********************************/
void UART1WriteBuff(u8* data, u16 len)
{
	u8 ch;
//	INT8U err;
//	u8 resend_times = 0;

//	RESEND:
	
	sent_CMD = 1;

	while(len > 0)
	{
		len--;
		ch=*data;
		UART1_SendByte(ch);
		data++;
	}
	
//	OSFlagPend(Flag_Grp, 0x08, OS_FLAG_WAIT_SET_ALL|OS_FLAG_CONSUME, 20, &err); // 等待2S超时
//	
//	// 超时，则重发
//	if(err == OS_ERR_TIMEOUT)
//	{
//		LOG("OS_Time_OUT\n");
//		resend_times++;
//		if(resend_times >= 2)
//		{
//			return;
//		}
//		goto RESEND;
//	}
}

/************************************
函数功能：向串口2发送一个字符
函数入口：字符参数
函数出口：无
函数说明：
***********************************/
void UART2_SendByte(u16 Data)
{ 
   while (!(USART2->SR & USART_FLAG_TXE));		//发送数据标志位空
   USART2->DR = (Data & (uint16_t)0x01FF);	
   while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);  	/* Loop until the end of transmit */ 
 //  USART_ClearFlag(USART1,USART_FLAG_TXE); 
   
}
/************************************
函数功能：向串口2发送一串字符
函数入口：字符串指针
函数出口：无
函数说明：
***********************************/
void UART2_SendString(u8* data)
{
	u8 ch;
	while(*data!='\0')
	{
		ch=*data;
		UART2_SendByte(ch);
		*data++;
	}		
}

/************************************
函数功能：向串口3发送一个字符
函数入口：字符参数
函数出口：无
函数说明：
***********************************/
void UART3_SendByte(u16 Data)
{ 
   while (!(USART3->SR & USART_FLAG_TXE));		//发送数据标志位空
   USART3->DR = (Data & (uint16_t)0x01FF);	
   while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);  	/* Loop until the end of transmit */ 
 //  USART_ClearFlag(USART1,USART_FLAG_TXE); 
   
}
/************************************
函数功能：向串口2发送一串字符
函数入口：字符串指针
函数出口：无
函数说明：
***********************************/
void UART3_SendString(u8* data)
{
	u8 ch;
	while(*data!='\0')
	{
		ch=*data;
		UART3_SendByte(ch);
		*data++;
	}		
}

#include <stdio.h>
#include <stdarg.h>
void log1(const char * format, ...)
{
        char str[64];
        va_list ap;

        va_start(ap, format);
        (void)vsnprintf(str, sizeof(str), format, ap);
        va_end(ap);
        
		UART3_SendString((u8*)str);
		UART3_SendString((u8*)"\r\n");
		
//        simple_uart_putstring((const uint8_t *)str);
//        simple_uart_putstring((const uint8_t *)"\r\n");
}

void log2(const char * format, ...)
{
        char str[64];
        va_list ap;

        va_start(ap, format);
        (void)vsnprintf(str, sizeof(str), format, ap);
        va_end(ap);
        
		UART3_SendString((u8*)str);
//		UART3_SendString((u8*)"\n");
		
//        simple_uart_putstring((const uint8_t *)str);
//        simple_uart_putstring((const uint8_t *)"\r\n");
}


/************************************
函数功能：串口1初始化配置
函数入口：无
函数出口：无
函数说明：
***********************************/	
void USART1_Configuration(void)
{
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate            = 115200  ;
	USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits            = USART_StopBits_1;
	USART_InitStructure.USART_Parity              = USART_Parity_No ;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
	USART_Init(USART1, &USART_InitStructure);
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 
	USART_Cmd(USART1, ENABLE);						 //打开串口1
   

}
/************************************
函数功能：串口2初始化配置
函数入口：无
函数出口：无
函数说明：
***********************************/
void USART2_Configuration(void)
{
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate            = 9600  ;
	USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits            = USART_StopBits_1;
	USART_InitStructure.USART_Parity              = USART_Parity_No ;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
	USART_Init(USART2, &USART_InitStructure);
//	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); 	   //打开串口2
	USART_Cmd(USART2, ENABLE);		
	USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);				 

}

/************************************
函数功能：串口3初始化配置
函数入口：无
函数出口：无
函数说明：
***********************************/
void USART3_Configuration(void)
{
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate            = 9600;
	USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits            = USART_StopBits_1;
	USART_InitStructure.USART_Parity              = USART_Parity_No ;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
	USART_Init(USART3, &USART_InitStructure);
	USART_Cmd(USART3, ENABLE);		
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);				 

}

/************************************
函数功能：串口3中断函数
函数入口：无
函数出口：无
函数说明：通过串口3中断接收终端修改数据、ID、IP、超速值、更新频率、弯道和站点数据
		 
***********************************/
#ifdef   USART3_Send

void USART3_IRQHandler(void)
{
	 u8 c=0;
	 static u8 start2=0,num2=0;
	 INT8U err;


	if(USART_GetFlagStatus(USART3, USART_FLAG_RXNE)!= RESET)	  //判断是否接受到数据
	{ 
		USART_ClearITPendingBit(USART3, USART_IT_RXNE);	 //清除中断接收标志位
 		c=USART3->DR;
		
		 if(c=='*'&&Modify_Compelet_Flag==0)
		 {
		   start2=1;
		   num2=0;
		 }
		 if(start2)
		 {
		   Rev_Data[num2++]=c;
		   if(c=='#')
		   {
			  Modify_Compelet_Flag=1;
			  start2=0;
			  num2=0;			 
			  OSFlagPost(Flag_Grp,0x04,OS_FLAG_SET,&err);
		   }
		 }
	//	 UART3_SendByte(c);		 		 			 
	 }
}
#endif

#ifdef SPI_Send
void SPI1_IRQHandler(void)
{
	 u8 c=0;
	 static u8 start=0,num=0;
	 INT8U err;

	 if((SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE))!=RESET)
	 {			
		 c=SPI_I2S_ReceiveData(SPI1);
		
		 if(c=='*'&&Modify_Compelet_Flag==0)
		 {
		   start=1;
		   num=0;
		 }
		 if(start)
		 {
		   Rev_Data[num++]=c;
		   if(c=='#')
		   {
			  Modify_Compelet_Flag=1;
			  start=0;
			  num=0;			 
			  OSFlagPost(Flag_Grp,0x04,OS_FLAG_SET,&err);
		   }
		 }
	//	 UART2_SendByte(c);		 		 			 
	 }
}	
#endif	 
/************************************
函数功能：串口2中断函数
函数入口：无
函数出口：无
函数说明：通过串口2中断接受GPS时间、纬度、经度、定位状态、速度、日期
		 
***********************************/
void USART2_IRQHandler(void)
{
	u8 c;
	INT8U err;

//	USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);	  //关闭串口2中断

  	if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE)!= RESET)	  //判断是否接受到数据
	{ 
	
		USART_ClearITPendingBit(USART2, USART_IT_RXNE);	 //清除中断接收标志位

		c=USART2->DR;
			
		if(c=='$')				  						//接收语句的标识符
		{
		    start=1;
		}
		if(start==1)		   							//接收开始
		{
			if(num<6)
			{
			GPS.Buf[num++]=c;	   						//缓存$GPRMC
			d=GPS.Buf[4];
			}
			else
			{
				
			  if(d=='M')				  				//判断是否是GPRMC语句
				{
					if(c==',')				   			//判断是第几个逗号
					{
						Comma++;
						j=0;
					
					}
					else
					{
							
							
						switch(Comma)
						{
							case 1:if(j<6){GPS.Buf_Time[j++]=c;} break;	 //时间缓存
							case 2:GPS.Buf_Statu=c; break;				 //定位状态缓存
							case 3:if(j<9){GPS.Buf_WeiDu[j++]=c;} break;  //纬度缓存
							case 5:if(j<10){GPS.Buf_JingDu[j++]=c;} break;//经度缓存	
							case 7:if(j<5){GPS.Buf_Speed[j++]=c;}break;	  //速度缓存
							case 8:if(j<5){GPS.Buf_Course[j++]=c;}break;	  //航向角缓存
							case 9:if(j<6){GPS.Buf_Data[j++]=c;} break;	  //日期缓存
						}
							
					}
				}
				else
				{
					num=0;
					Comma=0;
					start=0;
				}
			}
			if(c=='\n')				 					//一句语句接收完毕
			{
				GPS.Buf_Time[6]='\0'; 
				GPS.Buf_WeiDu[9]='\0';	
				GPS.Buf_JingDu[10]='\0';
				GPS.Buf_Speed[5]='\0';
				GPS.Buf_Course[5]='\0';	
				GPS.Buf_Data[6]='\0'; 
				
				Comma=0;
				num=0;
				start=0;
				Statue=GPS.Buf_Statu;
			//	err=OSSemPost(Sem);			//接收完一组新的GPS数据则发送一个信号量
				OSFlagPost(Flag_Grp,0x01,OS_FLAG_SET,&err);
			}	 
		}				   
		
	}
 //   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); 		   //使能串口1中断

}	  

/************************************
函数功能：串口1中断函数
函数入口：无
函数出口：无
函数说明：
***********************************/

#if 0
void USART1_IRQHandler(void)
{
	INT8U err;
	u8 c;
	Heart_Flag=0;
//	USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{ 	
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);	
	    c=USART1->DR;

/*		if(c=='*')
		{
		   Rev_start=1;
		}
		if(Rev_start)
		{
		   Rev_Data[Rev_Num++]=c;
		   if(c=='#')
		   {
			  Rev_start=0;
			  Rev_Num=0;
			  begin=0;
			  Rec_GPRS_Conter=0;
			  OSFlagPost(Flag_Grp,0x04,OS_FLAG_SET,&err);
		   }
		}		   	*/
		
			//+					 //	ERROR
		if((c==0x2B&&START!=1)||(c==0x45&&(!begin)))					//接收返回数据的第二行（第二行的数据前面有0d 0d 0a三个字符）
		{
			begin=1;
			Rec_GPRS_Conter=0;
		}			//OK									 //Wait...AT Command ready
		else if(((c==0x4F)&&(START==1||START==10||START==11))||(c==0x57))
		{			
			begin=1;
			Rec_GPRS_Conter=0;
		}

		if(begin)
		{
			Rec_GPRS[Rec_GPRS_Conter++]=c;
			if(Rec_GPRS[4]=='R'&&Rec_GPRS[5]=='T'&&Rec_GPRS_Conter>12)
			{
				if(c==0x2c)
				{
				  Rev_start=1;
				  Rev_Num=0;
				}
				else if(Rev_start)
				{
				   Rev_Data_Buff[Rev_Num++]=c;
				   if(c==0x0d)
				   {
					  Rev_Data_Buff[Rev_Num]='\0';
					  Rev_start=0;
					  Rev_Num=0;
					  begin=0;
					  Rec_GPRS_Conter=0;					  
					  OSFlagPost(Flag_Grp,0x04,OS_FLAG_SET,&err);
				   }
				}		   

			}										
			else if(c==0x0d)
			{				
				begin=0;
				Rec_GPRS_Conter=0;
				GPRS_REV_OK=1;

				Rev_start=0;
			    Rev_Num=0;					
			}
						
		}  					 	
	} 
  //  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 

}
#endif
	

void USART1_IRQHandler(void)
{
	u8 c;
//	INT8U err;

	Heart_Flag=0;
	sent_CMD = 0;
	
//	OSFlagPost(Flag_Grp, 0x08, OS_FLAG_SET, &err);
	
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{ 	
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);	
	    c=USART1->DR;
		
		if((c==0x55)&&(!begin))
		{
			begin=1;
			Rec_GPRS_Conter=0;
		}		
	
		if(begin)
		{
			Rec_GPRS[Rec_GPRS_Conter++]=c;
			if(Rec_GPRS[0]==0x55&&Rec_GPRS[1]==0xAA&&Rec_GPRS_Conter>11)
			{
				if(c==0xAA)
				{		   
				  	begin=0;
					Rec_GPRS_Conter=0;
					GPRS_REV_OK=1;
				}				   
			}										
			else if(Rec_GPRS_Conter>15)
			{				
				begin=0;
				Rec_GPRS_Conter=0;
				
			}
						
		}  					 	
	} 

}

int fputc(int ch, FILE *f)
{

USART_SendData(USART3, (uint8_t) ch);

while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);

return ch;
}

